import { CONFIG } from '@/constants/config';
import { api } from './api';
import type { UserDetail } from './generated/models';
import { message } from 'antd';

/**
 * 获取当前用户信息
 */
export async function getCurrentUser(): Promise<UserDetail | undefined> {
  try {
    const token = localStorage.getItem(CONFIG.CACHE.TOKEN_KEY);
    if (!token) {
      return undefined;
    }

    // 尝试从缓存中获取用户信息
    const cachedUserInfo = localStorage.getItem(CONFIG.CACHE.USER_INFO_KEY);
    if (cachedUserInfo) {
      return JSON.parse(cachedUserInfo);
    }

    // 如果缓存中没有，则从服务器获取
    const userInfo = await api.accounts.accountsUsersMeRetrieve();
    localStorage.setItem(CONFIG.CACHE.USER_INFO_KEY, JSON.stringify(userInfo));
    return userInfo;
  } catch (error) {
    console.error('获取用户信息失败:', error);
    return undefined;
  }
}

/**
 * 刷新 token
 * @returns 新的 access token
 */
export async function refreshToken(): Promise<string> {
  const refreshToken = localStorage.getItem(CONFIG.CACHE.REFRESH_TOKEN_KEY);
  if (!refreshToken) {
    throw new Error('No refresh token found');
  }

  const response = await api.token.tokenRefreshCreate({
    tokenRefreshRequestRequest: {
      refresh: refreshToken,
    },
  });

  // Store the new tokens
  localStorage.setItem(CONFIG.CACHE.TOKEN_KEY, response.access);
  if (response.refresh) {
    localStorage.setItem(CONFIG.CACHE.REFRESH_TOKEN_KEY, response.refresh);
  }

  return response.access;
}

/**
 * 清除所有认证信息
 */
export function clearAuth() {
  localStorage.removeItem(CONFIG.CACHE.TOKEN_KEY);
  localStorage.removeItem(CONFIG.CACHE.REFRESH_TOKEN_KEY);
  localStorage.removeItem(CONFIG.CACHE.USER_INFO_KEY);
  localStorage.removeItem(CONFIG.CACHE.DEVICE_ID_KEY);
}

/**
 * 登出
 * @param logoutAll 是否登出所有设备
 * @returns Promise<boolean> 登出是否成功
 */
export async function logout(logoutAll: boolean = false): Promise<boolean> {
  try {
    if (logoutAll) {
      // 登出所有设备
      await api.auth.authDevicesLogoutAllCreate();
      message.success('已登出所有设备');
    } else {
      // 获取当前设备 ID
      const deviceId = localStorage.getItem(CONFIG.CACHE.DEVICE_ID_KEY);
      if (!deviceId) {
        console.warn('未找到设备 ID，将登出所有设备');
        await api.auth.authDevicesLogoutAllCreate();
        message.success('已登出所有设备');
      } else {
        await api.auth.authDevicesLogoutCreate({ id: deviceId });
        message.success('登出成功');
      }
    }

    // 清除认证信息
    clearAuth();
    
    // 如果不在登录页，则跳转到登录页
    if (window.location.pathname !== '/login') {
      // 使用 history.pushState 来保持浏览器历史记录的清洁
      window.history.pushState({}, '', '/login');
      // 触发一个 popstate 事件，让路由系统感知到 URL 变化
      window.dispatchEvent(new PopStateEvent('popstate'));
    }

    return true;
  } catch (error) {
    console.error('登出失败:', error);
    message.error('登出失败，请重试');
    
    // 即使后端请求失败，也清除本地认证信息并跳转到登录页
    clearAuth();
    
    if (window.location.pathname !== '/login') {
      window.history.pushState({}, '', '/login');
      window.dispatchEvent(new PopStateEvent('popstate'));
    }
    
    return false;
  }
}
